//
//  ViewController.m
//  27_Block
//
//  Created by 徐昊 on 16/8/19.
//  Copyright © 2016年 徐昊. All rights reserved.
//

#import "ViewController.h"
#import "CUstomViewController.h"
@interface ViewController ()
// Block在属性中声明
@property (nonatomic, copy) void (^xxxBlock)();
// Block写在方法中
- (void)handleData:(void (^)(void))handleData;
@property (retain, nonatomic) IBOutlet UILabel *testLabel;
@end

@implementation ViewController

- (void)handleData:(void (^)(void))handleData {
//    [[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest new] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//        
//        handleData();
//    }];
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 1. Block是什么? 消息传递机制 之一
    // Block 与 函数相似, 有固定功能的代码块
    // 2. BLock基本语法
    // int a;
    // block 声明
    // 类型 void(^)(void) 变量名 block
    // 返回值 (^block名)(参数列表);
    void (^block)(void);
    // 2> block的赋值
    // block变量 = ^(参数列表) { 固定的代码段 };
    block = ^(void) {
        
    };
    // 3. Block的几种形式
    // 有参有返回
    int (^sum)(int, int) = ^(int a, int b) {
        return a + b;
    };
    // 无参无返回
    void (^block1)() = ^{
        self.view.backgroundColor = [UIColor orangeColor];
    };
    // 有参无返回
    void (^printNumber)(int number) = ^(int number) {
        
    };
    // 无参有返回
    NSString *(^returnString)(void) = ^(void) {
        return @"呵呵呵";
    };
    // 系统提供了代码块可以直接使用, inlineBlock
//    <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
//        <#statements#>
//    };
    // 4. Block的调用
    sum(10, 20);
    printNumber(100);
    block1();
    
    // 5. 系统中的Block
    // 1. 模态((^ __nullable)(void))completion
//    [self presentViewController:[UIViewController new] animated:YES completion:<#^(void)completion#>
    // 2. GCD void (^dispatch_block_t)(void)
//    dispatch_sync(dispatch_get_main_queue(), ^{
//        
//        
//    });
    // 3. 网络数据请求 (void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error))
//    [[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest new] completionHandler:<#^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)completionHandler#>];
    
    // 6. Block写在属性和方法上
    // 属性block修饰符, 使用copy
    self.xxxBlock = block1;
    self.xxxBlock();
    // 带Block的方法的调用
    [self handleData:^{
        
        
    }];
    // 7. 类型修饰符
    // __block __weak __strong
    
    // 1> __block 在ARC下和MRC下有区别
    // 可以在 block 内部修改外部变量
    // 在ARC下不能避免循环引用的问题
    // MRC下可以
    int __block a = 0;
    __block int b = 0;
    void (^blockTest)() = ^{
        a = 100;
    };
    // 2> __weak 修饰Block外的变量
    //    只能在ARC下使用, 避免Block的循环引用
    // 3> __strong 强引用
    
}
- (IBAction)pushNextVC:(id)sender {
    CUstomViewController *vc = [[CUstomViewController alloc] init];
    // 值传递, 需要实现Block
    // 告诉block, 该指针弱引用
    CUstomViewController * __block weakVC = vc;
    vc.passTitle = ^(NSString *title) {
        // Block会对其内部的所有对象进行强引用
        self.testLabel.text = title;
        weakVC.view.backgroundColor = [UIColor yellowColor];
    };
    [self.navigationController pushViewController:vc animated:YES];
    [vc release];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
